package main

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"os"

	"github.com/urfave/cli/v2"
)

var List []string
var tasksFile = "./cmd/tasks.json" // 任务列表保存的文件名

func init() {
	// 尝试从文件中加载任务列表
	err := loadTasksFromFile()
	if err != nil {
		fmt.Println("无法加载任务列表，将使用空列表")
	}
}

func main() {
	app := &cli.App{
		Commands: []*cli.Command{
			{
				Name:    "add",
				Usage:   "add a task to the list",
				Aliases: []string{"a"},
				Action:  Add,
			},
			{
				Name:    "delete",
				Usage:   "delete a from the list",
				Aliases: []string{"d"},
				Action:  Delete,
			},
			{
				Name:    "update",
				Usage:   "update the task from the list",
				Aliases: []string{"u"},
				Action:  Update,
			},
			{
				Name:    "query",
				Usage:   "query a task from the list",
				Aliases: []string{"q"},
				Action:  Query,
			},
		},
	}

	if err := app.Run(os.Args); err != nil {
		_, err2 := fmt.Fprintln(os.Stderr, err)
		if err2 != nil {
			return
		}
		os.Exit(1)
	}
	// 将任务列表保存到文件中
	saveTasksToFile()
}

func loadTasksFromFile() error {
	// 读取文件内容
	data, err := ioutil.ReadFile(tasksFile)
	if err != nil {
		fmt.Println("无法读取任务列表文件:", err)
		return err
	}

	// 反序列化JSON到切片
	err = json.Unmarshal(data, &List)
	if err != nil {
		fmt.Println("解析任务列表文件时出错:", err)
		return err // 或者进行其他错误处理
	}
	return nil
}

func saveTasksToFile() {
	// 序列化切片为JSON
	data, err := json.Marshal(List)
	if err != nil {
		fmt.Println("无法保存任务列表到文件:", err)
		return
	}

	// 将JSON写入文件
	err = ioutil.WriteFile(tasksFile, data, 0644)
	if err != nil {
		fmt.Println("无法保存任务列表到文件:", err)
	}
}

func Add(c *cli.Context) error {
	task := c.Args().First()
	fmt.Println("add task: ", task)
	if task == "" {
		return fmt.Errorf("请指定要添加的任务")
	}
	for _, t := range List {
		if t == task {
			fmt.Println("任务已存在，无需重复添加")
			return nil
		}
	}
	List = append(List, task)
	return nil
}

func Delete(c *cli.Context) error {
	task := c.Args().First()
	if task == "" {
		return fmt.Errorf("请指定要删除的任务")
	}
	fmt.Println("delete task: ", task)
	for i, t := range List {
		if task == t {
			List = append(List[:i], List[i+1:]...)
			fmt.Println("任务已成功删除")
			return nil
		}
	}
	return cli.Exit("任务未找到", 1)
}

func Update(c *cli.Context) error {
	if c.NArg() != 2 {
		return fmt.Errorf("更新任务需要两个参数：旧任务和新任务内容")
	}
	oldTask := c.Args().Get(0)
	newTask := c.Args().Get(1)
	if oldTask == "" || newTask == "" {
		return fmt.Errorf("请指定有效的旧任务和新任务")
	}
	fmt.Println("update oldTask ", oldTask, ":", newTask)
	for i, t := range List {
		if oldTask == t {
			List[i] = newTask
			fmt.Println("任务已成功修改")
			return nil
		}
	}
	return cli.Exit("旧任务未找到", 1)
}

func Query(c *cli.Context) error {
	fmt.Println("Query taskList: ")
	for _, task := range List {
		fmt.Println("task: ", task)
	}
	return nil
}
